Snowflake のネットワークポリシーでユーザー種別ごとの制限を設定する
とーかみです。
Snowflake で接続元 IP 制限を行う際は、ネットワークポリシーによる制御を行います。
接続元 IP 制限は、全体で一律ではなくユーザー種別(人間用、サービス用)ごとに制限内容を切り替えたい場合があるため、設定例を検証してみました。
Snowflake ネットワークポリシーとは
Snowflake ネットワークポリシーは、許可リストまたはブロックリストを用いて Snowflake サービスや内部ステージに対するアクセス制御を行うことができるものです。
Snowflake ネットワークルールとは
Snowflake ネットワークルールは、ネットワークポリシーでアクセス制御ルールを設定する際に使用するルールの塊です。
ネットワークルールは以下の公式ドキュメントの記述サンプルの記載のように、モード、識別子タイプ、値リストを指定します。
ネットワークポリシーでは、ネットワークルールを複数指定することができます。
CREATE NETWORK RULE block_public_access
MODE = INGRESS
TYPE = IPV4
VALUE_LIST = ('0.0.0.0/0');
CREATE NETWORK RULE allow_vpceid_access
MODE = INGRESS
TYPE = AWSVPCEID
VALUE_LIST = ('vpce-0fa383eb170331202');
CREATE NETWORK POLICY allow_vpceid_block_public_policy
ALLOWED_NETWORK_RULE_LIST = ('allow_vpceid_access')
BLOCKED_NETWORK_RULE_LIST=('block_public_access');
ルールは適用範囲が小さいものが優先される
ネットワークポリシーは、アカウント、セキュリティ統合、またはユーザーに適用できます。複数のネットワークポリシーが適用されている場合、最も具体的なネットワークポリシーが、一般的なネットワークポリシーよりも優先されます。
アカウント
アカウントに適用されるネットワークポリシーは、最も一般的なネットワークポリシーです。これらのポリシーよりも、セキュリティ統合またはユーザーに適用されるネットワークポリシーが優先されます。セキュリティ統合
セキュリティ統合に適用されるネットワークポリシーは、アカウントに適用されるネットワークポリシーよりも優先されますが、ユーザーに適用されるネットワークポリシーのほうが優先されます。ユーザー
ユーザーに適用されるネットワークポリシーは、最も具体的なネットワークポリシーです。これらのポリシーは、アカウントとセキュリティ統合の両方よりも優先されます。
ドキュメントの上記の記述の通り、適用範囲が小さいものほど優先されます。
- アカウントは Snowflake アカウントを指します
- セキュリティ統合は外部サービスとの連携やフェデレーションを設定する際に使用する接続用のオブジェクトです
- ユーザーは個々の Snowflake ユーザーを指します
優先度を表現すると ユーザー > セキュリティ統合 > アカウント
のようになります。
想定する利用シーン
今回の設定例では以下のようなアクセスがあるシーンを想定します。
- 人間のユーザーが社内ネットワークからアクセスする
- AWS Lambda のような外部ツールからサービスとしてアクセスする
設定する内容
- アカウント単位の設定
- 社内ネットワークを想定した IP アドレス(または CIDR ブロック)からのアクセスを許可
- ユーザー単位の設定
- Lambda からアクセスする際に仕様するサービス用のユーザーに対して設定
- Lambda から接続時に接続元となる IP アドレス(または CIDR ブロック)からのアクセスを許可
- 実際には NAT Gateway の Elastic IP や Lambda サービスの CIDR ブロックを指定することを想定します
設定と動作確認
記載している IP アドレス、 CIDR ブロックはサンプルです。
1. アカウント単位に許可ルールを設定し、範囲外の IP からのアクセスが拒否される
次のようなネットワークルール、ネットワークポリシーを作成し、アカウント単位に設定します。
USE SECURITYADMIN;
-- ネットワークルールを作成
CREATE OR REPLACE NETWORK RULE network_rule_sample_01
MODE = INGRESS
TYPE = IPV4
VALUE_LIST = ( '203.0.113.0/24' )
COMMENT = 'company network'
;
-- 作成したネットワークルールを利用したネットワークポリシーを作成
CREATE NETWORK POLICY test_network_policy_01
ALLOWED_NETWORK_RULE_LIST = ('network_rule_sample_01')
;
-- アカウントに対してネットワークポリシーを適用
ALTER ACCOUNT SET NETWORK_POLICY = test_network_policy_01;
許可ルールに指定した IP 範囲外からアクセスすると画像のようにサインインできないことが確認できました。
2. ユーザー単位に許可ルールを設定し、許可した IP からのアクセスが許可される
次のようなネットワークルール、ネットワークポリシーを作成し、ユーザー単位に設定します。
USE SECURITYADMIN;
-- ネットワークルールを作成
CREATE OR REPLACE NETWORK RULE network_rule_sample_02
MODE = INGRESS
TYPE = IPV4
VALUE_LIST = ( '198.51.100.0/24' )
COMMENT = 'custom ip'
;
-- 作成したネットワークルールを利用したネットワークポリシーを作成
CREATE NETWORK POLICY test_network_policy_02
ALLOWED_NETWORK_RULE_LIST = ('network_rule_sample_02')
;
-- 特定のユーザーに対してネットワークポリシーを適用
ALTER USER access_test_user SET NETWORK_POLICY = test_network_policy_02;
先ほど拒否されたものと同じ IP アドレスから接続している状態で再度サインインを試みると、サインインできることが確認できました。
まとめ
複数のネットワークポリシーを組み合わせてユーザー種別ごとに接続元 IP 制限を行う設定例を検証しました。
適用範囲を組み合わせることにより、人間用、サービス用ユーザーごとにネットワークポリシーを分けて制御することができます。
サービス用ユーザーは MFA 必須化にともない TYPE = SERVICE
属性を指定することになりますが、ネットワークポリシーとしては区別せず設定を行う形になります。
参考
ネットワークポリシーは各オブジェクトに 1 つのみ設定できるため、別のネットワークポリシーを新たに設定した場合は既存のネットワークポリシーは適用されなくなります。
ネットワークポリシーの除外のみを行う場合は UNSET
を使用します。
DROP NETWORK POLICY
はネットワークポリシー自体の削除が行われます。
-- アカウントに対してネットワークポリシーを除外
ALTER ACCOUNT UNSET NETWORK_POLICY;